#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Excel数据分析脚本
分析BMPT成本核算项目中的Excel数据文件
"""

import os
import sys
import openpyxl
from pathlib import Path
from collections import defaultdict
import re

# 添加项目路径
BASE_DIR = Path(__file__).parent
EXCEL_DATA_DIR = BASE_DIR / 'excel_data'

def analyze_excel_file(file_path, sheet_name=None):
    """分析单个Excel文件"""
    print(f"\n{'='*80}")
    print(f"分析文件: {file_path.name}")
    print(f"{'='*80}")
    
    try:
        # 读取Excel文件
        if file_path.suffix == '.xlsx':
            wb = openpyxl.load_workbook(file_path, data_only=True)
            sheet_names = wb.sheetnames
            print(f"工作表列表: {sheet_names}")
            
            # 分析每个工作表
            for sheet_name in sheet_names:
                print(f"\n--- 工作表: {sheet_name} ---")
                ws = wb[sheet_name]
                
                # 基本信息
                max_row = ws.max_row
                max_col = ws.max_column
                print(f"  行数: {max_row}")
                print(f"  列数: {max_col}")
                
                # 显示前几行
                print(f"\n  前10行数据 (前10列):")
                for row_idx in range(1, min(11, max_row + 1)):
                    row_data = []
                    for col_idx in range(1, min(11, max_col + 1)):
                        cell = ws.cell(row=row_idx, column=col_idx)
                        value = cell.value
                        if value is not None:
                            row_data.append(str(value)[:30])  # 限制长度
                        else:
                            row_data.append('')
                    non_empty = [v for v in row_data if v.strip()]
                    if non_empty:
                        print(f"    行{row_idx}: {' | '.join(non_empty[:8])}")
                
                # 分析数据结构
                analyze_structure(ws, sheet_name)
                
        else:
            print(f"  暂不支持 .xls 格式，请转换为 .xlsx")
            
    except Exception as e:
        print(f"  错误: {str(e)}")
        import traceback
        traceback.print_exc()

def analyze_structure(ws, sheet_name):
    """分析数据结构"""
    print(f"\n  数据结构分析:")
    
    # 查找可能的BOM相关列
    bom_keywords = ['零件号', '零件名称', '名称', 'part', 'part_no', 'part_number', 
                    '克重', '重量', 'weight', '材料', 'material', '工艺', 'process',
                    '层级', 'level', '序号', '编号', 'code']
    
    # 查找可能的成本相关列
    cost_keywords = ['成本', '价格', '单价', 'cost', 'price', '金额', 'amount',
                     '分摊', 'amortization', '投资', 'investment', '模具', 'mold',
                     '检具', 'fixture', '工装', 'equipment']
    
    # 查找可能的公式相关列
    formula_keywords = ['公式', 'formula', '计算', 'calculate', '费率', 'rate',
                        '合格率', 'pass_rate', 'passrate', '合格', '合格率']
    
    # 分析每一列
    found_bom_cols = []
    found_cost_cols = []
    found_formula_cols = []
    
    max_row = min(20, ws.max_row)
    max_col = min(30, ws.max_column)
    
    # 检查前20行，寻找表头
    for header_row in range(1, max_row + 1):
        for col_idx in range(1, max_col + 1):
            cell = ws.cell(row=header_row, column=col_idx)
            if cell.value:
                cell_str = str(cell.value).strip().lower()
                for keyword in bom_keywords:
                    if keyword.lower() in cell_str:
                        col_letter = openpyxl.utils.get_column_letter(col_idx)
                        entry = (col_idx, col_letter, cell_str, header_row)
                        if entry not in found_bom_cols:
                            found_bom_cols.append(entry)
                        break
                for keyword in cost_keywords:
                    if keyword.lower() in cell_str:
                        col_letter = openpyxl.utils.get_column_letter(col_idx)
                        entry = (col_idx, col_letter, cell_str, header_row)
                        if entry not in found_cost_cols:
                            found_cost_cols.append(entry)
                        break
                for keyword in formula_keywords:
                    if keyword.lower() in cell_str:
                        col_letter = openpyxl.utils.get_column_letter(col_idx)
                        entry = (col_idx, col_letter, cell_str, header_row)
                        if entry not in found_formula_cols:
                            found_formula_cols.append(entry)
                        break
    
    if found_bom_cols:
        print(f"    发现BOM相关列: {found_bom_cols[:8]}")
    if found_cost_cols:
        print(f"    发现成本相关列: {found_cost_cols[:8]}")
    if found_formula_cols:
        print(f"    发现公式相关列: {found_formula_cols[:8]}")
    
    # 分析BOM层级结构
    analyze_bom_structure(ws)

def analyze_bom_structure(ws):
    """分析BOM结构（层级、父子关系等）"""
    print(f"\n  BOM结构分析:")
    
    # 尝试识别层级
    indent_patterns = []
    number_patterns = []
    max_row = min(100, ws.max_row)
    
    for row_idx in range(1, max_row + 1):
        cell = ws.cell(row=row_idx, column=1)
        if cell.value:
            val_str = str(cell.value).strip()
            # 检查缩进（通过单元格格式）
            if val_str.startswith(' ') or val_str.startswith('\t'):
                indent_count = len(val_str) - len(val_str.lstrip())
                indent_patterns.append((row_idx, indent_count, val_str[:30]))
            # 检查序号格式
            if re.match(r'^\d+(\.\d+)+', val_str):
                number_patterns.append((row_idx, val_str))
    
    if indent_patterns:
        print(f"    发现空格缩进层级: {len(indent_patterns)}行，示例: {indent_patterns[:3]}")
    if number_patterns:
        print(f"    发现序号层级: {len(number_patterns)}行，示例: {number_patterns[:3]}")

def main():
    """主函数"""
    print("="*80)
    print("BMPT成本核算项目 - Excel数据分析")
    print("="*80)
    
    if not EXCEL_DATA_DIR.exists():
        print(f"错误: Excel数据目录不存在: {EXCEL_DATA_DIR}")
        return
    
    # 获取所有Excel文件
    excel_files = list(EXCEL_DATA_DIR.glob('*.xlsx')) + list(EXCEL_DATA_DIR.glob('*.xls'))
    
    if not excel_files:
        print(f"未找到Excel文件在: {EXCEL_DATA_DIR}")
        return
    
    print(f"\n找到 {len(excel_files)} 个Excel文件:")
    for f in excel_files:
        print(f"  - {f.name}")
    
    # 分析每个文件
    for excel_file in excel_files:
        analyze_excel_file(excel_file)
    
    # 生成总结报告
    print("\n" + "="*80)
    print("分析总结")
    print("="*80)
    print("""
建议:
1. 识别每个Excel文件的表头位置和列映射关系
2. 识别BOM层级格式（空格缩进 vs 序号格式）
3. 识别成本计算公式的位置和格式
4. 识别基础数据（材料价格、费率等）的位置
5. 为Excel导入功能设计列映射配置
    """)

if __name__ == '__main__':
    main()

